{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "report_reward_stock_PGRL_wo_combo_state_3actions_1net_multistock.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true,
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/samuelfield/stock_trading_agent_RL/blob/master/main.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "metadata": {
        "id": "8O9WDXrSbo3R",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "**Helpful Tutorials**\n",
        "\n",
        "https://www.youtube.com/watch?v=gCJyVX98KJ4&t=700s (guys watch this its a step by step tutorial)\n",
        "\n",
        "\n",
        "https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe\n",
        "\n",
        "https://medium.freecodecamp.org/an-introduction-to-deep-q-learning-lets-play-doom-54d02d8017d8\n",
        "\n",
        "https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html"
      ]
    },
    {
      "metadata": {
        "id": "lji7w4VIdNjR",
        "colab_type": "code",
        "outputId": "81ab758e-efc3-4864-9c3a-3b72f8ad87d8",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 238
        }
      },
      "cell_type": "code",
      "source": [
        "# use this cell to install any modules we need\n",
        "!pip install quandl"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: quandl in /usr/local/lib/python3.6/dist-packages (3.4.5)\n",
            "Requirement already satisfied: pandas>=0.14 in /usr/local/lib/python3.6/dist-packages (from quandl) (0.22.0)\n",
            "Requirement already satisfied: more-itertools in /usr/local/lib/python3.6/dist-packages (from quandl) (4.3.0)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from quandl) (1.11.0)\n",
            "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from quandl) (2.5.3)\n",
            "Requirement already satisfied: numpy>=1.8 in /usr/local/lib/python3.6/dist-packages (from quandl) (1.14.6)\n",
            "Requirement already satisfied: inflection>=0.3.1 in /usr/local/lib/python3.6/dist-packages (from quandl) (0.3.1)\n",
            "Requirement already satisfied: requests>=2.7.0 in /usr/local/lib/python3.6/dist-packages (from quandl) (2.18.4)\n",
            "Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas>=0.14->quandl) (2018.7)\n",
            "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.7.0->quandl) (3.0.4)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.7.0->quandl) (2018.11.29)\n",
            "Requirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.7.0->quandl) (2.6)\n",
            "Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.7.0->quandl) (1.22)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "0ZgTBUJDmyxq",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Because our state space is huge, we can't use Q-learning so we will use Deep-Q-learning.\n",
        "\n",
        "\n",
        "**Our Model:**\n",
        "\n",
        "1.   We take stock market information and our account information as input (money_in_account, stock1_price, stock2_price, stock1_shares_we_own, stock2_shares_we_own, etc)\n",
        "2.   It outputs Q value for each actions (do_nothing, buy_stock1, buy_stock2, sell_stock1, sell_stock2, etc)\n",
        "\n",
        "I can think of 2 limitations of this model:\n",
        "\n",
        "1.   We can only take 1 action at a time (but that shouldn't be a problem if we continuously run our model).\n",
        "2.   We can't specify how many shares to buy/sell (we can just assume we can only buy/sell X shares at once, then if our model wants to buy X shares of X stock. Then it just has to perform that action multiple times).\n",
        "\n",
        "To make things simple, we should just assume that there are no overheads to buying and selling stocks other than the brokerage fee.\n",
        "\n",
        "note: we should look into **policy gradient**, which is another approach to reinforcement learning which can handel contiuous action spaces which is more applicable to our problem\n",
        "\n"
      ]
    },
    {
      "metadata": {
        "id": "HoeSNsxGZko3",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# **Training stock trading agent using Deep-Q learning**"
      ]
    },
    {
      "metadata": {
        "id": "zFpHTLt9JRTc",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Import libraries"
      ]
    },
    {
      "metadata": {
        "id": "iacLdq9FZko4",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "%matplotlib inline\n",
        "\n",
        "import math\n",
        "import random\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "from datetime import date\n",
        "from calendar import monthrange\n",
        "from collections import deque\n",
        "\n",
        "# Intrinio dependencies\n",
        "from http.client import HTTPSConnection\n",
        "from base64 import b64encode\n",
        "import json\n",
        "\n",
        "# We gona use tensorflow instead of pytorch cuz tutorials are in tensorflow and its easier :v\n",
        "import tensorflow as tf\n",
        "import tensorflow.keras as k\n",
        "\n",
        "from IPython import display\n",
        "import quandl\n",
        "\n",
        "random.seed()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "DE0-CY2AGOOW",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## **Getting Training/Testing Data**"
      ]
    },
    {
      "metadata": {
        "id": "jlUyZSapJrjL",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# Helper functions\n",
        "def to_daily(monthly_data, target_dt):\n",
        "    data = np.asarray(monthly_data)\n",
        "    data_dt = monthly_data.reset_index()['Date']\n",
        "    \n",
        "    target_dt_rows = len(target_dt.index)\n",
        "    data_dt_rows = len(data_dt.index)\n",
        "    data_period = data_dt_rows/target_dt_rows # daily, monthly, quarterly\n",
        "    daily_data = np.ndarray((target_dt_rows,1))\n",
        "    j = 0\n",
        "    \n",
        "    for i in range(target_dt_rows):\n",
        "        daily_data[i] = data[j]\n",
        "        \n",
        "        if ((data_period < 1) and ((i+1) < target_dt_rows) and ((j+1) < data_dt_rows)):\n",
        "            target_combo = target_dt[i+1].year*100 + target_dt[i+1].month\n",
        "            data_combo = data_dt[j+1].year*100 + data_dt[j+1].month\n",
        "            \n",
        "            if (target_combo >= data_combo):\n",
        "                j += 1\n",
        "                \n",
        "        elif((data_period >= 1) and ((i+1) < target_dt_rows)): # Deal with daily data\n",
        "            while (data_dt[j].day < target_dt[i+1].day):\n",
        "                j += 1\n",
        "\n",
        "    return daily_data\n",
        "\n",
        "def preprocess_intrinio(data):\n",
        "    total = 0\n",
        "    for value in data['Value']:\n",
        "        if (isinstance(value, int) or isinstance(value, float)):\n",
        "            total += value\n",
        "            \n",
        "    avg = total / len(data['Value'])\n",
        "    \n",
        "    for i,value in enumerate(data['Value']):\n",
        "        if (isinstance(value, str)):\n",
        "            data['Value'][i] = avg\n",
        "    \n",
        "    return data\n",
        "    \n",
        "\n",
        "### Get data\n",
        "train_dr = (2008,12,31,2016,1,1)\n",
        "test_dr = (2016,1,1,2017,12,31)\n",
        "\n",
        "train_start_date = str(train_dr[0]) + \"-\" + str(train_dr[1]) + \"-\" + str(train_dr[2])\n",
        "train_end_date = str(train_dr[3]) + \"-\" + str(train_dr[4]) + \"-\" + str(train_dr[5])\n",
        "test_start_date = str(test_dr[0]) + \"-\" + str(test_dr[1]) + \"-\"+ str(test_dr[2])\n",
        "test_end_date = str(test_dr[3]) + \"-\" + str(test_dr[4]) + \"-\" + str(test_dr[5])\n",
        "\n",
        "# TICKER LIST - Enter company stock tickers\n",
        "ticker_list = [\"AAPL\",\"XOM\",\"ATVI\",\"GE\",\"WMT\"]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "8Q8mX1ixT5Rx",
        "colab_type": "code",
        "outputId": "ececd9d0-8b49-4da1-fc4f-bf9e4a010b32",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "# Get QUANDL share price data\n",
        "quandl.ApiConfig.api_key = \"okx11Jz3Rb2m5hzDdS-x\"\n",
        "basic_params = [\"Adj. Close\", \"Adj. Volume\"]\n",
        "\n",
        "# Get Intrinio share fundamentals (P/E, earnings, etc.)\n",
        "fundamentals =  ['debttoequity','divpayoutratio','roe','freecashflow','netincomegrowth', 'arturnover' ,'operatingmargin']  \n",
        "\n",
        "# Get Federal Reserve Economic Data (FRED) (Unemployment rate, interest rate, gdp, personal consumption, CPI, corporate profits)\n",
        "fred_codes = [\"UNRATE\",\"GDP\",\"PCE\",\"CPIAUCSL\",\"CP\"] \n",
        "\n",
        "#This sets up the https connection\n",
        "intrinio_url = \"api.intrinio.com\"\n",
        "intrinio_api_key = \"OmE5YTRmOTYxZDIyN2Q5ZTIwMWNhMGNmZjAyMWE4NjRh\"\n",
        "headers = { 'Authorization' : 'Bearer  %s' %  intrinio_api_key }\n",
        "train_dates = '&start_date={}&end_date={}'.format(train_start_date, train_end_date)\n",
        "test_dates = '&start_date={}&end_date={}'.format(test_start_date, test_end_date)\n",
        "\n",
        "c = HTTPSConnection(intrinio_url)\n",
        "\n",
        "all_train_data = []\n",
        "all_test_data = []\n",
        "\n",
        "for i, ticker in enumerate(ticker_list):\n",
        "    # Pull stock price data from WIKI\n",
        "    share_train_data = quandl.get(\"WIKI/\" + ticker, start_date=train_start_date, end_date=train_end_date)\n",
        "    share_test_data = quandl.get(\"WIKI/\" + ticker, start_date=test_start_date, end_date=test_end_date)\n",
        "\n",
        "    # Preprocess data by removing everything but \"Adj. Close\" and \"Adj. Volume\"\n",
        "    share_train_data.drop([\"Open\", \"High\", \"Low\", \"Close\", \"Volume\", \"Ex-Dividend\",\"Split Ratio\", \"Adj. Open\", \"Adj. High\",\"Adj. Low\"], axis=1, inplace=True)\n",
        "    share_test_data.drop([\"Open\", \"High\", \"Low\", \"Close\", \"Volume\", \"Ex-Dividend\",\"Split Ratio\", \"Adj. Open\", \"Adj. High\",\"Adj. Low\"], axis=1, inplace=True)\n",
        "\n",
        "    # Get the date time patterns for filling in other attributes\n",
        "    if (i == 0):\n",
        "        train_datetime = share_train_data.reset_index()['Date']\n",
        "        test_datetime = share_test_data.reset_index()['Date']\n",
        "        \n",
        "    # On first iteration, Initialize train and test arrays to data from first stock\n",
        "    share_train_data = share_train_data[0:len(train_datetime)]\n",
        "    share_test_data = share_test_data[0:len(train_datetime)]\n",
        "    \n",
        "    train_data = share_train_data[0:len(train_datetime)]\n",
        "    test_data = share_test_data[0:len(test_datetime)]\n",
        "\n",
        "    for fundamental in fundamentals:\n",
        "        pnumber = 1\n",
        "        more_pages = True\n",
        "        # Get training data\n",
        "        while(more_pages == True):\n",
        "            url_suffix = '/historical_data?type=QTR&page_number='+ str(pnumber) +'&identifier='+ticker+'&item='+fundamental+train_dates\n",
        "            c.request('GET', url_suffix, headers=headers)\n",
        "\n",
        "            # Read response\n",
        "            res = c.getresponse()\n",
        "            json_data = res.read()\n",
        "\n",
        "            # Convert json to Python dict object.\n",
        "            data_dict = json.loads(json_data)\n",
        "            if (pnumber == data_dict['total_pages']):\n",
        "                more_pages = False\n",
        "            if (pnumber==1):\n",
        "                share_train_data = pd.DataFrame(data_dict['data'])\n",
        "            else:\n",
        "                share_train_data = share_train_data.append(data_dict['data'])\n",
        "            pnumber += 1\n",
        "        \n",
        "        share_train_data.columns = ['Date','Value']\n",
        "        share_train_data['Date'] = pd.to_datetime(share_train_data['Date'])\n",
        "        share_train_data.set_index('Date',inplace=True, drop=True)\n",
        "        share_train_data = share_train_data.sort_index(ascending=True)\n",
        "        share_train_data = preprocess_intrinio(share_train_data)\n",
        "        share_train_data = to_daily(share_train_data, train_datetime)\n",
        "        \n",
        "        train_data = np.append(train_data, share_train_data, axis=1)\n",
        "            \n",
        "        # Get testing data\n",
        "        url_suffix = '/historical_data?identifier='+ticker+'&item='+fundamental+test_dates\n",
        "        c.request('GET', url_suffix, headers=headers)\n",
        "\n",
        "        # Read response\n",
        "        res = c.getresponse()\n",
        "        json_data = res.read()\n",
        "\n",
        "        # Convert json to Python dict object.\n",
        "        data_dict = json.loads(json_data)\n",
        "        share_test_data = pd.DataFrame(data_dict['data'])\n",
        "        share_test_data.columns = ['Date','Value']\n",
        "        share_test_data['Date'] = pd.to_datetime(share_test_data['Date'])\n",
        "        share_test_data.set_index('Date',inplace=True, drop=True)\n",
        "        share_test_data = share_test_data.sort_index(ascending=True)\n",
        "        share_test_data = to_daily(share_test_data, test_datetime)\n",
        "\n",
        "        test_data = np.append(test_data, share_test_data, axis=1)\n",
        "       \n",
        "    for i, code in enumerate(fred_codes):\n",
        "        # Pull econ data from FRED\n",
        "        econ_train_data = quandl.get('FRED/' + code, start_date=train_start_date, end_date=train_end_date)\n",
        "        econ_test_data = quandl.get('FRED/' + code, start_date=test_start_date, end_date=test_end_date)\n",
        "\n",
        "        econ_train_data = to_daily(econ_train_data, train_datetime)\n",
        "        econ_test_data = to_daily(econ_test_data, test_datetime)\n",
        "        \n",
        "        train_data = np.append(train_data, econ_train_data, axis=1)\n",
        "        test_data = np.append(test_data, econ_test_data, axis=1)\n",
        "        \n",
        "    all_train_data.append(train_data)\n",
        "    all_test_data.append(test_data)\n",
        "\n",
        "all_train_data = np.asarray(all_train_data)\n",
        "all_test_data = np.asarray(all_test_data)\n",
        "print(all_train_data.shape, all_test_data.shape)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(5, 1763, 14) (5, 501, 14)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "TcfElXs10EKl",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Hyperparameters"
      ]
    },
    {
      "metadata": {
        "id": "ObQVkb440JjX",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "train_rows = np.size(all_train_data, 1) # Number of rows\n",
        "train_cols = np.size(all_train_data, 2) # Number of cols\n",
        "test_rows = np.size(all_test_data, 1) # Number of rows\n",
        "test_cols = np.size(all_test_data, 2) # Number of cols\n",
        "\n",
        "# ### Model Hyperparameters\n",
        "brokerage_fee = 10 # Brokerage fee is $10.00 per buy or sell regardless of quanity bought\n",
        "stack_size = 32\n",
        "number_of_stocks = len(ticker_list)\n",
        "global_total_params = train_cols\n",
        "\n",
        "market_state_size = global_total_params # Total columns in training_data\n",
        "agent_state_size = 2\n",
        "\n",
        "state_size = [market_state_size, stack_size]\n",
        "# state_size = market_state_size\n",
        "\n",
        "global_action_size = 3\n",
        "tensorboard_path = './tensorboard/dqn/1'\n",
        "\n",
        "# Set-up agent state\n",
        "init_agent_state = [0]*2\n",
        "init_agent_state[0] = np.random.randint(8000, 12000)\n",
        "\n",
        "reward_func = 0"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "iwMfKkzcAoDz",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "##Normalize"
      ]
    },
    {
      "metadata": {
        "id": "OW9FTJgjGCEQ",
        "colab_type": "code",
        "outputId": "1b07b9a8-2f1f-43e0-b19d-15becb26e710",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 170
        }
      },
      "cell_type": "code",
      "source": [
        "# Get price data\n",
        "train_price_data = []\n",
        "test_price_data = []\n",
        "for stock in range(number_of_stocks):\n",
        "    price_data_tr = np.array(all_train_data[stock][:,0])\n",
        "    price_data_tr = price_data_tr.reshape((len(price_data_tr), 1))\n",
        "    train_price_data.append(price_data_tr)\n",
        "    \n",
        "    price_data_te = np.array(all_test_data[stock][:,0])\n",
        "    price_data_te = price_data_te.reshape((len(price_data_te), 1))\n",
        "    test_price_data.append(price_data_te)\n",
        "\n",
        "train_price_data = np.asarray(train_price_data)\n",
        "test_price_data = np.asarray(test_price_data)\n",
        "    \n",
        "    \n",
        "# Normalize data with z-score normalization    \n",
        "train_data_norm = all_train_data.copy()\n",
        "test_data_norm = all_test_data.copy()\n",
        "\n",
        "temp_concat = []\n",
        "for stock in range(number_of_stocks):\n",
        "    temp_concat.extend(all_train_data[stock])\n",
        "temp_concat = np.asarray(temp_concat)\n",
        "\n",
        "means = np.mean(temp_concat, axis=0)\n",
        "std_devs = np.std(temp_concat,axis=0)\n",
        "std_dev_cutoff = 0.00001\n",
        "print(means)\n",
        "print()\n",
        "print(std_devs)\n",
        "\n",
        "for stock in range(number_of_stocks):\n",
        "    for col in range(train_cols):\n",
        "        train_data_norm[stock][:,col] -= means[col]\n",
        "        if (std_devs[col] > std_dev_cutoff):\n",
        "            train_data_norm[stock][:,col] = (train_data_norm[stock][:,col] / std_devs[col])\n",
        "        else:\n",
        "            print('train problem',stock,col)\n",
        "\n",
        "    for col in range(test_cols):\n",
        "        test_data_norm[stock][:,col] -= means[col]\n",
        "        if (std_devs[col] > std_dev_cutoff):\n",
        "            test_data_norm[stock][:,col] = (test_data_norm[stock][:,col] / std_devs[col])\n",
        "        else:\n",
        "            print('test problem',stock,col)\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[4.42027912e+01 4.17508436e+07 8.85497630e-01 2.01105821e-01\n",
            " 1.94344135e-01 1.30865317e+10 2.21003938e-01 2.87039812e+01\n",
            " 1.64425262e-01 7.81395349e+00 1.62452905e+04 1.10169921e+04\n",
            " 2.27690471e+02 1.65206307e+03]\n",
            "\n",
            "[2.83913132e+01 5.19968110e+07 1.27298230e+00 7.00337925e-01\n",
            " 1.51291885e-01 3.95271899e+10 1.03800506e+00 2.95022905e+01\n",
            " 1.70039354e-01 1.55956361e+00 1.27536264e+03 8.19501308e+02\n",
            " 8.31954531e+00 2.08376908e+02]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "LS6Wtk7_uonF",
        "colab_type": "code",
        "outputId": "ad656d02-9f77-4d6a-86a4-7e337b51dd6a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        }
      },
      "cell_type": "code",
      "source": [
        "### TEST ###\n",
        "print(test_data_norm.shape)\n",
        "print(train_data_norm.shape)\n",
        "print(train_data_norm[0][0])\n",
        "print(global_action_size)\n",
        "print(number_of_stocks)\n",
        "print(train_price_data.shape)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(5, 501, 14)\n",
            "(5, 1763, 14)\n",
            "[-1.17057377  2.11810021 -0.60532582 -0.1227283   0.97130911 -0.06376611\n",
            "  0.16252717 -0.41316716  0.53692711 -0.00894705 -1.45115078 -1.50480792\n",
            " -1.89403029 -2.73349422]\n",
            "3\n",
            "5\n",
            "(5, 1763, 1)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "IQLKQbX58hd7",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Environment class"
      ]
    },
    {
      "metadata": {
        "id": "qklpXwQQcuqF",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "This class keeps track of our environment."
      ]
    },
    {
      "metadata": {
        "id": "dwRzzZyx8m8T",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# market_dataset = List of market_state (2D numpy array)\n",
        "# agent_state = [money, share_of_stock(i) for i in range(stocks)]\n",
        "# current_index = keep track of market_state\n",
        "# brokerage_fee = 0 < fee < 1\n",
        "class Environment:\n",
        "    def __init__(self, market_dataset, stock_prices, total_params, number_of_stocks, current_index, \n",
        "                 agent_state, action_size, brokerage_fee, stack_size, stock=0):\n",
        "      \n",
        "        self.cur_stock = stock\n",
        "    \n",
        "        self.market_dataset = market_dataset[:]\n",
        "        self.price_data = stock_prices[:]\n",
        "        self.total_params = int(total_params)\n",
        "        self.number_of_stocks = number_of_stocks\n",
        "        self.current_index = current_index\n",
        "        \n",
        "        self.prev_agent_state = agent_state[:]\n",
        "        self.agent_state = agent_state[:]\n",
        "        self.action_size = action_size\n",
        "        self.actions = np.zeros((action_size, action_size))\n",
        "        self.brokerage_fee = brokerage_fee\n",
        "        self.stack_size = stack_size\n",
        "        self.start_cash = agent_state[0]\n",
        "        self.start_price = self.price_data[self.cur_stock][self.current_index][0]\n",
        "        self.baseline_agent_state = agent_state[:] # baseline for comparison (using passive, equal value quantity)\n",
        "        \n",
        "        self.prev_purchase_price = 0\n",
        "        \n",
        "        shape = self.market_dataset[self.cur_stock][0].shape\n",
        "        self.make_action_hot_encoding()\n",
        "        self.data_deque = deque([np.zeros(shape) for i in range(self.stack_size)], maxlen=self.stack_size)\n",
        "        self.set_baseline() # Initialize base line\n",
        "        self.init_state() # Initialize the stacked_state\n",
        "        \n",
        "        # Freeze the baseline combined market agent state for reward calculation at end\n",
        "        \n",
        "    \n",
        "    # Helper function to return market_state appened with agent_state\n",
        "    def combine_market_agent_(self):\n",
        "        return self.market_dataset[self.cur_stock][self.current_index];\n",
        "      \n",
        "    # Turn number of actions into a 1 hot encoding of actions\n",
        "    def make_action_hot_encoding(self):\n",
        "        for i in range(self.action_size):\n",
        "            self.actions[i][i] = 1\n",
        "    \n",
        "    # Make the the baseline portfolio\n",
        "    def set_baseline(self):\n",
        "        alloc_funds = self.baseline_agent_state[0]\n",
        "        stock_price = self.price_data[self.cur_stock][self.current_index]\n",
        "        quantity_to_buy = int(alloc_funds / stock_price)\n",
        "        self.baseline_agent_state[1] = quantity_to_buy\n",
        "        self.baseline_agent_state[0] -=  quantity_to_buy * stock_price\n",
        "                   \n",
        "    # fill data_deque with current state\n",
        "    def init_state(self):\n",
        "        for i in range(self.stack_size):\n",
        "            self.data_deque.append(self.market_dataset[self.cur_stock][self.current_index])\n",
        "            self.current_index += 1\n",
        "    \n",
        "    # Get the stack of (stack_size) previous (includeing current) state\n",
        "    def get_state(self):\n",
        "        return np.stack(self.data_deque, axis=1)\n",
        "    \n",
        "    # Agent state is \n",
        "    def get_agent_state(self):\n",
        "#         cash_mean_std = self.start_cash / 2\n",
        "#         normalized_money = (self.agent_state[0] - cash_mean_std)/cash_mean_std\n",
        "        \n",
        "#         possible_stock = int((self.start_cash - self.brokerage_fee)/self.start_price)\n",
        "#         stock_mean_std = possible_stock /2\n",
        "#         normalized_stock = (self.agent_state[1] - stock_mean_std)/stock_mean_std\n",
        "\n",
        "        normalized_money = 1\n",
        "        normalized_stock = 0\n",
        "\n",
        "        if (self.agent_state[1] > 0):\n",
        "            normalized_money = 0\n",
        "            normalized_stock = 1        \n",
        "        \n",
        "        return np.array([normalized_money, normalized_stock])\n",
        "      \n",
        "    # Calculate reward. Reward would be Profit in our scenario\n",
        "    def get_reward(self, old_state, new_state):\n",
        "        total_money = 0\n",
        "            \n",
        "        old_shares = old_state[1]\n",
        "        new_shares = new_state[1]\n",
        "\n",
        "        todays_price = self.price_data[self.cur_stock][self.current_index]\n",
        "        yesterdays_price = self.price_data[self.cur_stock][self.current_index - 1]\n",
        "        possible_shares = int((self.agent_state[0] - self.brokerage_fee)/yesterdays_price)\n",
        "\n",
        "        if (old_shares > new_shares): # if there is a sale\n",
        "            total_money += ((old_shares - new_shares) * (todays_price - self.prev_purchase_price))\n",
        "            self.prev_purchase_price = 0\n",
        "\n",
        "        if (old_shares < new_shares): # if there is a buy\n",
        "            total_money += ((new_shares - old_shares) * (todays_price - yesterdays_price))\n",
        "            self.prev_purchase_price = yesterdays_price\n",
        "\n",
        "        if ((old_shares == new_shares) and (new_shares > 0)): # if there is a hold but could have sold\n",
        "            total_money += ((new_shares * (todays_price - self.prev_purchase_price)) - \n",
        "                             old_shares * (yesterdays_price - self.prev_purchase_price))\n",
        "\n",
        "        if ((old_shares == new_shares) and (new_shares == 0)): # if there is a hold but could have bought\n",
        "            total_money += (possible_shares * (yesterdays_price - todays_price))\n",
        "                \n",
        "        return total_money\n",
        "    \n",
        "    def get_actual_reward(self, old_state, new_state):\n",
        "        total_money_old = old_state[0]\n",
        "        old_shares = old_state[1]\n",
        "        old_price = self.price_data[self.cur_stock][self.current_index - 1]\n",
        "        total_money_old += (old_shares * old_price)\n",
        "                    \n",
        "        total_money_new = new_state[0]\n",
        "        new_shares = new_state[1]\n",
        "        new_price = self.price_data[self.cur_stock][self.current_index]\n",
        "        total_money_new += (new_shares * new_price)\n",
        "            \n",
        "        return total_money_new - total_money_old\n",
        "\n",
        "    \n",
        "    def get_reward_baseline(self):\n",
        "        bl_state_1 = self.baseline_agent_state[:]\n",
        "        bl_state_1 = np.reshape(bl_state_1, (agent_state_size, 1))\n",
        "        \n",
        "        bl_state_2 = self.baseline_agent_state[:]\n",
        "        bl_state_2 = np.reshape(bl_state_2, (agent_state_size, 1))\n",
        "            \n",
        "        return self.get_actual_reward(bl_state_1, bl_state_2)\n",
        "    \n",
        "    def get_binary_reward(self):\n",
        "        actual_reward = self.get_actual_reward(self.prev_agent_state[:], self.agent_state[:])\n",
        "        bl_reward = self.get_reward_baseline()\n",
        "        \n",
        "        ret = 0 \n",
        "        \n",
        "        \n",
        "        if reward_func == 0:\n",
        "            ret = self.get_reward(self.prev_agent_state[:], self.agent_state[:])\n",
        "        if reward_func == 1:\n",
        "            ret = actual_reward\n",
        "        if reward_func == 2:\n",
        "            ret = actual_reward - bl_reward\n",
        "        if reward_func == 3:\n",
        "            if (actual_reward > bl_reward):\n",
        "                ret = 1\n",
        "            if (actual_reward <= bl_reward):\n",
        "                ret = -1\n",
        "        \n",
        "        return ret\n",
        "            \n",
        "    # Check to see if action is legal for a given state\n",
        "    def is_legal(self,action):\n",
        "        \n",
        "        if action == 0:\n",
        "            return True\n",
        "        else:\n",
        "            stock_price = self.price_data[self.cur_stock][self.current_index][0]\n",
        "            value = stock_price * self.agent_state[1] - self.brokerage_fee\n",
        "            \n",
        "            if action % 2 == 1:   # Buy All\n",
        "                remain = int((self.agent_state[0] - self.brokerage_fee)/stock_price)\n",
        "                return remain > 0\n",
        "            else: # Sell All\n",
        "                share_value = (stock_price * self.agent_state[1])\n",
        "                return (self.agent_state[1] >= 1) and ((self.agent_state[0] + share_value - self.brokerage_fee) > 0)\n",
        "    \n",
        "    # Perform action and move to next market_state (increment current_index)\n",
        "    def next(self, action):\n",
        "        self.prev_agent_state = self.agent_state[:]\n",
        "        stock_price = self.price_data[self.cur_stock][self.current_index][0]\n",
        "        \n",
        "        if action == 0:\n",
        "#             print('none',self.agent_state)\n",
        "            pass\n",
        "        else:\n",
        "            # Buy Actions\n",
        "            if action % 2 == 1: # All remaining cash on stock\n",
        "                remain = int((self.agent_state[0] - self.brokerage_fee)/stock_price)\n",
        "                self.agent_state[1] += remain\n",
        "                self.agent_state[0] -= (remain * stock_price)\n",
        "#                 print('buy',self.agent_state)\n",
        "                \n",
        "            # Sell Actions\n",
        "            else: # All holdings of stock\n",
        "                pre_stock = self.agent_state[1]\n",
        "                pre_cash = self.agent_state[0]\n",
        "                self.agent_state[0] = (pre_cash - self.brokerage_fee) + (stock_price * pre_stock) \n",
        "                self.agent_state[1] = 0\n",
        "#                 print('sell',self.agent_state)\n",
        "                \n",
        "#         print(self.agent_state[0], self.brokerage_fee, stock_price, self.agent_state[1])\n",
        "                                \n",
        "        # move to next market_state\n",
        "        self.current_index += 1\n",
        "        # Append state to data_deque, will pop out oldest state\n",
        "        self.data_deque.append(self.market_dataset[self.cur_stock][self.current_index])\n",
        "        new_state = self.get_state()\n",
        "        return new_state, self.get_binary_reward(), self.get_actual_reward(self.prev_agent_state, self.agent_state)\n",
        "              \n",
        "    def get_random_legal_action(self, state):\n",
        "        action = random.randint(0, self.action_size-1)\n",
        "        while not self.is_legal(state, action):\n",
        "            action = random.randint(0, self.action_size-1)\n",
        "        return action\n",
        "      \n",
        "    def reset(self, market_state_index, agent_state, stock=0):\n",
        "        self.cur_stock = stock\n",
        "        self.current_index = market_state_index\n",
        "        self.start_cash = agent_state[0]\n",
        "        self.start_price = self.price_data[self.cur_stock][self.current_index][0]\n",
        "        self.prev_agent_state = agent_state[:]\n",
        "        self.agent_state = agent_state[:]\n",
        "        self.baseline_agent_state = agent_state[:]\n",
        "        self.prev_purchase_price = 0\n",
        "        \n",
        "        self.set_baseline()\n",
        "        self.init_state()\n",
        "        \n",
        "        \n",
        "## CHANGES ##\n",
        "# rename init_stacked_state to init_state()\n",
        "# rename get_state() to combine_market_agent_()\n",
        "# rename get_stacked_state() to get_state()\n",
        "# state now referes to a stacked_state\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "uyB4s-douNoG",
        "colab_type": "code",
        "outputId": "059e5af8-b09c-4d02-ce83-3234249f765a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "# ## TEST ###\n",
        "## market_dataset, stock_params, number_of_stocks, current_index, agent_state, brokerage_fee, stack_size\n",
        "print(init_agent_state)\n",
        "env = Environment(market_dataset = train_data_norm,\n",
        "                  stock_prices = train_price_data,\n",
        "                  total_params = global_total_params,\n",
        "                  number_of_stocks = number_of_stocks,\n",
        "                  current_index = 0,\n",
        "                  agent_state = init_agent_state[:],\n",
        "                  action_size = global_action_size,\n",
        "                  brokerage_fee = brokerage_fee,\n",
        "                  stack_size = stack_size)\n",
        "\n",
        "state = env.get_state()\n",
        "# print(state)\n",
        "\n",
        "# # Do nothing\n",
        "# state, reward, bl = env.next(2)\n",
        "# print(state)\n",
        "# print(reward)\n",
        "# print('--------------------------')\n",
        "\n",
        "# # # Buy: All money on stock 1\n",
        "# state, reward = env.next(8)\n",
        "# print(state)\n",
        "# print(reward)\n",
        "# print('--------------------------')\n",
        "\n",
        "# # # Sell 1/3 shares of stock 1\n",
        "# state, reward = env.next(4)\n",
        "# print(state)\n",
        "# print(reward)\n",
        "# print('--------------------------')"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[11687, 0]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "n1Me81oRvwM8",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Neural Network model"
      ]
    },
    {
      "metadata": {
        "id": "toTJAjrzv1ka",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "conv_data_format = 'channels_first'\n",
        "reg_scale = 0.1\n",
        "class policyGradNetwork_v1:\n",
        "    def __init__(self, state_size, action_size, learning_rate, name):\n",
        "        self.state_size = state_size\n",
        "        self.action_size = action_size\n",
        "        self.learning_rate = learning_rate\n",
        "        self.name = name\n",
        "        \n",
        "        with tf.variable_scope(self.name):\n",
        "            with tf.name_scope(\"inputs\"):\n",
        "                # state size: [None, 16, 32]\n",
        "                self.inputs_ = tf.placeholder(tf.float32, [None, *self.state_size], name='inputs_')\n",
        "                self.agent_inputs = tf.placeholder(tf.float32, [None, 2], name='agent_inputs')\n",
        "                self.actions_ = tf.placeholder(tf.float32, [None, self.action_size], name='actions_')\n",
        "                self.discounted_episode_rewards_ = tf.placeholder(tf.float32, [None,], name=\"discounted_episode_rewards\")\n",
        "                self.keep_prob = tf.placeholder(tf.float32, [None,], name=\"keep_prob\")\n",
        "                \n",
        "            with tf.name_scope(\"conv1\"):\n",
        "                # First convolution\n",
        "                # Input is 16x32\n",
        "                self.conv1 = tf.layers.conv1d(inputs = self.inputs_,\n",
        "                                              filters = 32,\n",
        "                                              data_format = conv_data_format,\n",
        "                                              kernel_size = 8,\n",
        "                                              strides = 4,\n",
        "                                              activation='relu',\n",
        "                                              padding = 'VALID',\n",
        "                                              kernel_initializer=tf.contrib.layers.xavier_initializer(),\n",
        "                                              kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=reg_scale),\n",
        "                                              name = 'conv1')\n",
        "\n",
        "#                 self.conv1_batchnorm = tf.layers.batch_normalization(self.conv1,\n",
        "#                                                            training = True,\n",
        "#                                                            epsilon = 1e-5,\n",
        "# #                                                              axis=1,\n",
        "#                                                              name = 'batch_norm1')\n",
        "\n",
        "                self.conv1_out = tf.nn.leaky_relu(self.conv1, name=\"conv1_out\")\n",
        "                ## --> [15,32]\n",
        "\n",
        "            with tf.name_scope(\"conv2\"):\n",
        "                # Second convolution\n",
        "                self.conv2 = tf.layers.conv1d(inputs = self.conv1_out,\n",
        "                                              filters = 64,\n",
        "                                              data_format = conv_data_format,\n",
        "                                              kernel_size = 4,\n",
        "                                              strides = 2,\n",
        "                                              padding = 'VALID',\n",
        "                                              kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                              kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=reg_scale),\n",
        "                                              name = 'conv2')\n",
        "\n",
        "#                 self.conv2_batchnorm = tf.layers.batch_normalization(self.conv2,\n",
        "#                                                            training = True,\n",
        "#                                                            epsilon = 1e-5,\n",
        "# #                                                              axis=1,\n",
        "#                                                              name = 'batch_norm2')\n",
        "\n",
        "                self.conv2_out = tf.nn.leaky_relu(self.conv2, name=\"conv2_out\")\n",
        "                ## -> [5,64]\n",
        "\n",
        "            with tf.name_scope(\"conv3\"):\n",
        "                # Third convolution\n",
        "                self.conv3 = tf.layers.conv1d(inputs = self.conv2_out,\n",
        "                                              filters = 128,\n",
        "                                              data_format = conv_data_format,\n",
        "                                              kernel_size = 2,\n",
        "                                              strides = 1,\n",
        "                                              padding = 'VALID',\n",
        "                                              kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                              kernel_regularizer = tf.contrib.layers.l2_regularizer(scale=reg_scale),\n",
        "                                              name = 'conv3')\n",
        "\n",
        "#                 self.conv3_batchnorm = tf.layers.batch_normalization(self.conv3,\n",
        "#                                                            training = True,\n",
        "#                                                            epsilon = 1e-5,\n",
        "# #                                                              axis=1,\n",
        "#                                                              name = 'batch_norm3')\n",
        "\n",
        "                self.conv3_out = tf.nn.leaky_relu(self.conv3, name=\"conv3_out\")\n",
        "                ## --> [3,128]\n",
        "            \n",
        "            with tf.name_scope(\"flatten\"):\n",
        "                self.flatten = tf.contrib.layers.flatten(self.conv2_out)\n",
        "                ## --> [?]\n",
        "            \n",
        "            with tf.name_scope(\"fc1\"):\n",
        "                self.concat = tf.concat([self.flatten, self.agent_inputs], 1)\n",
        "                self.dense = tf.layers.dense(inputs = self.concat,\n",
        "                                             units = 512,\n",
        "                                             activation = tf.nn.leaky_relu,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                             kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=reg_scale))\n",
        "            \n",
        "            with tf.name_scope(\"logits\"):\n",
        "#                 self.drop_out = tf.nn.dropout(self.dense, 0.3)\n",
        "                self.output = tf.layers.dense(inputs = self.dense,\n",
        "                                          kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                          units = self.action_size,\n",
        "                                          activation = None)\n",
        "                 \n",
        "            with tf.name_scope(\"softmax\"):\n",
        "                self.action_distribution = tf.nn.softmax(self.output)\n",
        "                        \n",
        "            # loss is diff between predicton and reality\n",
        "            with tf.name_scope(\"loss\"):\n",
        "                self.neg_log_prob = tf.nn.softmax_cross_entropy_with_logits_v2(logits = self.output, labels = self.actions_)\n",
        "                self.loss = tf.reduce_mean(self.neg_log_prob * self.discounted_episode_rewards_)\n",
        "                \n",
        "                l2_loss = tf.losses.get_regularization_loss()\n",
        "                self.loss = self.loss + l2_loss\n",
        "                \n",
        "            with tf.name_scope(\"train\"):\n",
        "                self.optimizer = tf.train.AdamOptimizer(self.learning_rate, epsilon=1e-4).minimize(self.loss)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "SVrUhK5iiy0h",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class policyGradNetwork_v2:\n",
        "    def __init__(self, state_size, action_size, learning_rate, name):\n",
        "        self.state_size = state_size\n",
        "        self.action_size = action_size\n",
        "        self.learning_rate = learning_rate\n",
        "        self.name = name\n",
        "        \n",
        "        with tf.variable_scope(self.name):            \n",
        "            self.inputs_ = tf.placeholder(tf.float32, [None, *self.state_size], name='inputs_')\n",
        "            self.agent_inputs = tf.placeholder(tf.float32, [None, 2], name='agent_inputs')\n",
        "            self.actions_ = tf.placeholder(tf.float32, [None, self.action_size], name='actions_')\n",
        "            self.discounted_episode_rewards_ = tf.placeholder(tf.float32, [None,], name=\"discounted_episode_rewards\")\n",
        "            \n",
        "            \n",
        "            with tf.name_scope(\"inputs\"):\n",
        "                self.input1 = tf.layers.dense(inputs = self.inputs_[:,0,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input2 = tf.layers.dense(inputs = self.inputs_[:,1,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input3 = tf.layers.dense(inputs = self.inputs_[:,2,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input4 = tf.layers.dense(inputs = self.inputs_[:,3,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input5 = tf.layers.dense(inputs = self.inputs_[:,4,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input6 = tf.layers.dense(inputs = self.inputs_[:,5,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input7 = tf.layers.dense(inputs = self.inputs_[:,6,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input8 = tf.layers.dense(inputs = self.inputs_[:,7,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input9 = tf.layers.dense(inputs = self.inputs_[:,8,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input10 = tf.layers.dense(inputs = self.inputs_[:,9,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input11 = tf.layers.dense(inputs = self.inputs_[:,10,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input12 = tf.layers.dense(inputs = self.inputs_[:,11,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input13 = tf.layers.dense(inputs = self.inputs_[:,12,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                self.input14 = tf.layers.dense(inputs = self.inputs_[:,13,:],\n",
        "                                             units = 4,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer())\n",
        "                \n",
        "                self.concat1 = tf.concat([self.input1,self.input2,self.input3,self.input4,self.input5,self.input6,self.input7,\n",
        "                                   self.input8,self.input9,self.input10,self.input11,self.input12,self.input13,self.input14], 1)\n",
        "                \n",
        "                self.flatten = tf.contrib.layers.flatten(self.concat1)\n",
        "                \n",
        "                self.concat2 = tf.concat([self.flatten, self.agent_inputs], 1)\n",
        "                \n",
        "#             with tf.name_scope(\"bn1\"):\n",
        "#                 self.bn1 = tf.layers.batch_normalization(inputs = self.flatten)\n",
        "                \n",
        "            with tf.name_scope(\"lrelu1\"):\n",
        "                self.lrelu1 = tf.nn.elu(features = self.concat2)\n",
        "                \n",
        "            with tf.name_scope(\"dense2\"): \n",
        "                self.dense2 = tf.layers.dense(inputs = self.lrelu1,\n",
        "                                             units = 64,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                             kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=reg_scale))\n",
        "                \n",
        "#             with tf.name_scope(\"bn2\"):\n",
        "#                 self.bn2 = tf.layers.batch_normalization(inputs = self.dense2)\n",
        "                \n",
        "            with tf.name_scope(\"lrelu2\"):\n",
        "                self.lrelu2 = tf.nn.elu(features = self.dense2)\n",
        "                \n",
        "            with tf.name_scope(\"dense3\"):\n",
        "                self.dense3 = tf.layers.dense(inputs = self.lrelu2,\n",
        "                                             units = 64,\n",
        "                                             kernel_initializer = tf.contrib.layers.xavier_initializer(),\n",
        "                                             kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=reg_scale))\n",
        "                \n",
        "#             with tf.name_scope(\"bn3\"):\n",
        "#                 self.bn3 = tf.layers.batch_normalization(inputs = self.dense3)\n",
        "                \n",
        "            with tf.name_scope(\"lrelu3\"):\n",
        "                self.lrelu3 = tf.nn.elu(features = self.dense3)\n",
        "                \n",
        "            with tf.name_scope(\"output\"):\n",
        "                self.drop_out = tf.nn.dropout(self.lrelu3, 0.3)\n",
        "                self.output = tf.layers.dense(inputs = self.drop_out, units = self.action_size)\n",
        "                 \n",
        "            with tf.name_scope(\"softmax\"):\n",
        "#                 mean, var = tf.nn.moments(self.output, [1], keep_dims=True)\n",
        "#                 self.sub = tf.div(tf.subtract(self.output, mean), tf.sqrt(var))\n",
        "                self.sub = self.output\n",
        "                self.action_distribution = tf.nn.softmax(self.sub)\n",
        "                        \n",
        "            # loss is diff between predicton and reality\n",
        "            with tf.name_scope(\"loss\"):\n",
        "                self.neg_log_prob = tf.nn.softmax_cross_entropy_with_logits_v2(logits = self.output, labels = self.actions_)\n",
        "                self.loss = tf.reduce_mean(self.neg_log_prob * self.discounted_episode_rewards_)\n",
        "                \n",
        "                l2_loss = tf.losses.get_regularization_loss()\n",
        "                self.loss = self.loss + l2_loss\n",
        "                \n",
        "            with tf.name_scope(\"train\"):\n",
        "                self.optimizer = tf.train.AdamOptimizer(self.learning_rate).minimize(self.loss)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "dXKhrB-Ta1gu",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Training"
      ]
    },
    {
      "metadata": {
        "id": "wTSb3QQ_789f",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# Training Hyperparameters\n",
        "##########################\n",
        "learning_rate = 0.001\n",
        "max_steps = 7 #len(test_data_norm) - 1 - stack_size\n",
        "batch_size = 64\n",
        "num_epochs = 1000\n",
        "\n",
        "# Discount rate\n",
        "gamma = 0.95\n",
        "##########################\n",
        "\n",
        "# PGNetwork1 = policyGradNetwork_v1(state_size, global_action_size, learning_rate, name=\"PGNetwork1\")\n",
        "# PGNetwork2 = policyGradNetwork_v2(state_size, global_action_size, learning_rate, name=\"PGNetwork2\")\n",
        "env.reset(0, init_agent_state[:], 0)\n",
        "\n",
        "comparison_array = [1]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "QVqJpIKka4S2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def possible_actions(local_env):\n",
        "    actions_num = 0\n",
        "    if (local_env.is_legal(1) and local_env.is_legal(2)):\n",
        "        return 0\n",
        "    if (local_env.is_legal(1)):\n",
        "        return 1\n",
        "    if (local_env.is_legal(2)):\n",
        "        return 2\n",
        "\n",
        "def choose_action(state, agent_state, local_env, train_session, network):\n",
        "    action_probability_distribution = sess.run(network.action_distribution, \n",
        "                                           feed_dict={network.inputs_: state.reshape((1, *state_size)),\n",
        "                                                     network.agent_inputs: agent_state.reshape((1, 2))})\n",
        "\n",
        "    action_probs = action_probability_distribution.ravel()\n",
        "    \n",
        "    action_size = global_action_size\n",
        "    \n",
        "    # If training shuffle probabilities 10% of the time\n",
        "    if (train_session):\n",
        "        if (np.random.random_sample() < 0.1):\n",
        "            np.random.shuffle(action_probs)\n",
        "    \n",
        "    # reduce\n",
        "    for i in range(global_action_size):\n",
        "        if(action_probs[i] == 0):\n",
        "            action_size -= 1\n",
        "    \n",
        "    # select action w.r.t the actions prob\n",
        "    for i in range(global_action_size):\n",
        "        actions = np.random.choice(range(action_probability_distribution.shape[1]), size=action_size, p=action_probs, replace=False)\n",
        "\n",
        "        for action in actions:\n",
        "            if local_env.is_legal(action):\n",
        "                return action\n",
        "        \n",
        "    return 0\n",
        "\n",
        "def discount_and_normalize_rewards(episode_rewards):\n",
        "    discounted_episode_rewards = np.zeros_like(episode_rewards)\n",
        "    cumulative = 0.0\n",
        "    for i in reversed(range(len(episode_rewards))):\n",
        "        cumulative = cumulative * gamma + episode_rewards[i]\n",
        "        discounted_episode_rewards[i] = cumulative\n",
        "    \n",
        "    mean = np.mean(discounted_episode_rewards)\n",
        "    std = np.std(discounted_episode_rewards)\n",
        "    if (std == 0):\n",
        "        std = 1\n",
        "    discounted_episode_rewards = (discounted_episode_rewards - mean) / (std)\n",
        "    \n",
        "    return discounted_episode_rewards\n",
        "        "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "CWCr8u-0yFzC",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def make_batch(batch_size, env, sess, network):\n",
        "    episode_states, episode_actions, episode_rewards, episode_actual_rewards, baseline_rewards, ep_agent_state = [],[],[],[],[],[]\n",
        "    rewards_of_batch, discounted_episode_rewards = [],[]\n",
        "    \n",
        "    episode_num  = 1\n",
        "    step = 0\n",
        "                  \n",
        "    while True:\n",
        "        step = 0\n",
        "        \n",
        "        stock_num = random.randint(0, number_of_stocks - 1)\n",
        "        start_day = random.randint(0, train_rows - max_steps - stack_size - 1)\n",
        "        ep_init_agent_state = init_agent_state[:]\n",
        "        ep_init_agent_state[0] = np.random.randint(8000, 12000)\n",
        "        \n",
        "        env.reset(start_day, ep_init_agent_state, stock_num)\n",
        "        state = env.get_state()\n",
        "        \n",
        "        while step < max_steps:\n",
        "            step += 1\n",
        "            \n",
        "            agent_state = env.get_agent_state()\n",
        "            action_id = choose_action(state, agent_state, env, training, network)\n",
        "            action = env.actions[action_id]\n",
        "\n",
        "            next_state, disc_reward, actual_reward = env.next(action_id)\n",
        "            \n",
        "            # Store s, a, r\n",
        "            episode_states.append(state)\n",
        "            episode_actions.append(action)\n",
        "            ep_agent_state.append(agent_state)\n",
        "            episode_rewards.append(disc_reward)\n",
        "            episode_actual_rewards.append(actual_reward)\n",
        "            baseline_rewards.append(env.get_reward_baseline())\n",
        "            \n",
        "            state = next_state\n",
        "              \n",
        "        # Deal with episode and total rewards\n",
        "        episode_rewards_sum = np.sum(episode_rewards)\n",
        "        rewards_of_batch.append(episode_rewards_sum)\n",
        "              \n",
        "        discounted_episode_rewards.append(discount_and_normalize_rewards(episode_rewards))\n",
        "              \n",
        "        episode_rewards = []      \n",
        "        episode_num += 1\n",
        "              \n",
        "        if (episode_num > batch_size):\n",
        "            break\n",
        "    \n",
        "    episode_states = np.stack(np.array(episode_states))\n",
        "    episode_actions = np.stack(np.array(episode_actions))\n",
        "    discounted_episode_rewards = np.squeeze(np.concatenate(discounted_episode_rewards))\n",
        "    \n",
        "\n",
        "    return episode_states, episode_actions, ep_agent_state, rewards_of_batch, discounted_episode_rewards, episode_num, episode_actual_rewards, baseline_rewards"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "PwTCwop2dWiv",
        "colab_type": "code",
        "outputId": "280d1625-a99a-4a4c-8feb-63e2ba156f34",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 17017
        }
      },
      "cell_type": "code",
      "source": [
        "# CNN training (policyGradNetwork_v1)\n",
        "ep_index = [i for i in range(num_epochs)]\n",
        "daily_avg_reward_axis = np.zeros((len(comparison_array),num_epochs))\n",
        "actual_reward_axis = np.zeros((len(comparison_array),num_epochs))\n",
        "baseline_axis = np.zeros((len(comparison_array),num_epochs))\n",
        "loss_axis = np.zeros((len(comparison_array),num_epochs))\n",
        "\n",
        "allRewards = []\n",
        "total_rewards = 0\n",
        "maximumRewardRecorded = 0\n",
        "mean_reward_total = []\n",
        "average_reward = []\n",
        "\n",
        "training = True\n",
        "\n",
        "tf.reset_default_graph()\n",
        "PGNetwork2 = policyGradNetwork_v2(state_size, global_action_size, learning_rate, name=\"PGNetwork2\")\n",
        "saver = tf.train.Saver()\n",
        "\n",
        "if training:\n",
        "    for i, comparison in enumerate(comparison_array):\n",
        "        reward_func = comparison\n",
        "        \n",
        "        epoch = 1\n",
        "        with tf.Session() as sess:\n",
        "            sess.run(tf.global_variables_initializer())\n",
        "#             saver.restore(sess,\"./models/model\" + str(i) + \".ckpt\")\n",
        "\n",
        "            while epoch < num_epochs + 1:  \n",
        "                states_mb, actions_mb, agent_state_mb, rewards_of_batch, discounted_rewards_mb, nb_episodes_mb,  actual_rewards, bl_rewards = make_batch(batch_size, env, sess, PGNetwork2)\n",
        "                                \n",
        "                total_reward_of_that_batch = np.sum(rewards_of_batch)\n",
        "                allRewards.append(total_reward_of_that_batch)\n",
        "\n",
        "                mean_reward_of_that_batch = np.divide(total_reward_of_that_batch, nb_episodes_mb)\n",
        "                mean_reward_total.append(mean_reward_of_that_batch)\n",
        "\n",
        "                average_reward_of_all_training = np.divide(np.sum(mean_reward_total), epoch)\n",
        "\n",
        "                maximumRewardRecorded = np.amax(allRewards)\n",
        "\n",
        "                # Feedforward, gradient and backpropagation\n",
        "                loss_, _ = sess.run([PGNetwork2.loss, PGNetwork2.optimizer],\n",
        "                                    feed_dict={PGNetwork2.inputs_: states_mb.reshape((len(states_mb), global_total_params, stack_size)),\n",
        "                                    PGNetwork2.agent_inputs: agent_state_mb,\n",
        "                                    PGNetwork2.actions_: actions_mb,\n",
        "                                    PGNetwork2.discounted_episode_rewards_: discounted_rewards_mb\n",
        "                                    })\n",
        "\n",
        "                daily_avg_reward_axis[i][epoch-1] = average_reward_of_all_training/max_steps\n",
        "                actual_reward_axis[i][epoch-1] = np.sum(actual_rewards)\n",
        "                baseline_axis[i][epoch-1] =  np.sum(bl_rewards)\n",
        "                loss_axis[i][epoch-1] = loss_\n",
        "\n",
        "                # Reset the transition stores\n",
        "                actual_rewards, bl_rewards = [],[]\n",
        "\n",
        "                # Save model every 5 episodes\n",
        "                if epoch % 10 == 0:\n",
        "                    save_path = saver.save(sess, \"./models/model\" + str(i) + \".ckpt\")\n",
        "                    print(\"==========================================\")\n",
        "                    print(\"Epoch: \", epoch, \"/\", num_epochs)\n",
        "                    print(\"-----------\")\n",
        "                    print(\"Number of training episodes: {}\".format(nb_episodes_mb))\n",
        "                    print(\"Total reward: {}\".format(total_reward_of_that_batch, nb_episodes_mb))\n",
        "                    print(\"Mean Reward of that batch {}\".format(mean_reward_of_that_batch))\n",
        "                    print(\"Daily average reward of all training: {}\".format(average_reward_of_all_training/max_steps))\n",
        "                    print(\"Max reward for a batch so far: {}\".format(maximumRewardRecorded))\n",
        "                    print(\"Training Loss: {}\".format(loss_))\n",
        "                    print(\"==========================================\")\n",
        "\n",
        "                epoch += 1\n",
        "                \n",
        "        mean_reward_total = []\n",
        "        allRewards = []\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "==========================================\n",
            "Epoch:  10 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1008.2416126464504\n",
            "Mean Reward of that batch 15.511409425330006\n",
            "Daily average reward of all training: -1.111515601063188\n",
            "Max reward for a batch so far: 3367.5479787514105\n",
            "Training Loss: 5.614917278289795\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  20 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1728.9276567406914\n",
            "Mean Reward of that batch -26.598887026779867\n",
            "Daily average reward of all training: 2.090045822783366\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 5.0126237869262695\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  30 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1416.2797228147692\n",
            "Mean Reward of that batch 21.788918812534913\n",
            "Daily average reward of all training: 1.5328969864329085\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 4.393564224243164\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  40 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1096.1314039465915\n",
            "Mean Reward of that batch -16.863560060716793\n",
            "Daily average reward of all training: 1.7935153135428978\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 3.7910983562469482\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  50 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1838.288596079352\n",
            "Mean Reward of that batch -28.281363016605415\n",
            "Daily average reward of all training: 1.0572429221595743\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 3.384829521179199\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  60 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3741.5808047403443\n",
            "Mean Reward of that batch 57.562781611389916\n",
            "Daily average reward of all training: 1.083683269594924\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 2.9277775287628174\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  70 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 152.97445366836382\n",
            "Mean Reward of that batch 2.3534531333594435\n",
            "Daily average reward of all training: 1.177600426515182\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 2.642117738723755\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  80 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 337.4355590969617\n",
            "Mean Reward of that batch 5.191316293799411\n",
            "Daily average reward of all training: 1.4058895888178367\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 2.337594985961914\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  90 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -2081.2570666012025\n",
            "Mean Reward of that batch -32.01933948617235\n",
            "Daily average reward of all training: 1.4270400003289085\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 1.913952112197876\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  100 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -2.941515470082777\n",
            "Mean Reward of that batch -0.045254084155119646\n",
            "Daily average reward of all training: 1.6361695047983236\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 1.7437210083007812\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  110 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2481.17626803877\n",
            "Mean Reward of that batch 38.171942585211845\n",
            "Daily average reward of all training: 1.8450918791861746\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 1.558732509613037\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  120 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -4224.135586008388\n",
            "Mean Reward of that batch -64.98670132320596\n",
            "Daily average reward of all training: 1.8263437182812858\n",
            "Max reward for a batch so far: 7372.950689953833\n",
            "Training Loss: 1.2982574701309204\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  130 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1.8377687305119252\n",
            "Mean Reward of that batch 0.02827336508479885\n",
            "Daily average reward of all training: 1.8924599149612897\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 1.0431283712387085\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  140 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1467.1435333545996\n",
            "Mean Reward of that batch -22.57143897468615\n",
            "Daily average reward of all training: 1.895880685816549\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 1.0226925611495972\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  150 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2463.902334566863\n",
            "Mean Reward of that batch 37.906189762567124\n",
            "Daily average reward of all training: 1.7227448781635657\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.8182407021522522\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  160 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -137.28885914858165\n",
            "Mean Reward of that batch -2.112136294593564\n",
            "Daily average reward of all training: 1.832214935208045\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.7735888957977295\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  170 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5984.985236237377\n",
            "Mean Reward of that batch 92.07669594211349\n",
            "Daily average reward of all training: 2.004929227090039\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.43721991777420044\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  180 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2295.1643021939644\n",
            "Mean Reward of that batch 35.310220033753296\n",
            "Daily average reward of all training: 2.0625080005865315\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.5037360191345215\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  190 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2666.5719491187765\n",
            "Mean Reward of that batch 41.02418383259656\n",
            "Daily average reward of all training: 2.182199796112463\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.37324273586273193\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  200 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4383.824582162405\n",
            "Mean Reward of that batch 67.44345511019084\n",
            "Daily average reward of all training: 2.295597380649813\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.3060300350189209\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  210 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 464.4941882465828\n",
            "Mean Reward of that batch 7.146064434562812\n",
            "Daily average reward of all training: 2.450889215205262\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.37555086612701416\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  220 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1230.0617137774234\n",
            "Mean Reward of that batch 18.924026365806515\n",
            "Daily average reward of all training: 2.5137015670816294\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.13841721415519714\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  230 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4202.2078747555015\n",
            "Mean Reward of that batch 64.64935191931541\n",
            "Daily average reward of all training: 2.6153107783194947\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.2933516800403595\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  240 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1824.5657259603895\n",
            "Mean Reward of that batch 28.070241937852145\n",
            "Daily average reward of all training: 2.6553948042122246\n",
            "Max reward for a batch so far: 7414.9382908055095\n",
            "Training Loss: 0.1873120665550232\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  250 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -760.8888868868489\n",
            "Mean Reward of that batch -11.705982875182292\n",
            "Daily average reward of all training: 2.746149602200618\n",
            "Max reward for a batch so far: 8385.608993366524\n",
            "Training Loss: 0.10260651260614395\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  260 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -4262.721403763463\n",
            "Mean Reward of that batch -65.58032928866866\n",
            "Daily average reward of all training: 2.716709590315304\n",
            "Max reward for a batch so far: 8385.608993366524\n",
            "Training Loss: 0.16070373356342316\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  270 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -533.3831549844981\n",
            "Mean Reward of that batch -8.2058946920692\n",
            "Daily average reward of all training: 2.8326151972041345\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.02314235270023346\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  280 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5808.256579350096\n",
            "Mean Reward of that batch 89.35779352846302\n",
            "Daily average reward of all training: 2.876942234732549\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.09089168906211853\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  290 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1619.5300234862816\n",
            "Mean Reward of that batch 24.915846515173563\n",
            "Daily average reward of all training: 2.9313959915377565\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.06707777082920074\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  300 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6478.938015404434\n",
            "Mean Reward of that batch 99.67596946776052\n",
            "Daily average reward of all training: 3.000771409828951\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.006889872252941132\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  310 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5206.1045169771005\n",
            "Mean Reward of that batch 80.09391564580154\n",
            "Daily average reward of all training: 3.142370597339642\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.10569116473197937\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  320 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2603.195556174858\n",
            "Mean Reward of that batch 40.04916240269013\n",
            "Daily average reward of all training: 3.163715462748873\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: 0.09097585082054138\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  330 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3422.397780004735\n",
            "Mean Reward of that batch 52.65227353853439\n",
            "Daily average reward of all training: 3.1842820915708105\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: 0.11750523746013641\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  340 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1261.5726987068729\n",
            "Mean Reward of that batch 19.408810749336507\n",
            "Daily average reward of all training: 3.2532335901427487\n",
            "Max reward for a batch so far: 9327.757412648385\n",
            "Training Loss: -0.1611446589231491\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  350 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5376.53468440172\n",
            "Mean Reward of that batch 82.71591822156493\n",
            "Daily average reward of all training: 3.3675339250239134\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: -0.15422660112380981\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  360 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1259.7830243419057\n",
            "Mean Reward of that batch -19.38127729756778\n",
            "Daily average reward of all training: 3.386767142468751\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: 0.01012440025806427\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  370 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6457.298348993561\n",
            "Mean Reward of that batch 99.34305152297787\n",
            "Daily average reward of all training: 3.5092519470612977\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: -0.39227694272994995\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  380 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6000.458077553703\n",
            "Mean Reward of that batch 92.31473965467237\n",
            "Daily average reward of all training: 3.6039447841377545\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: 0.23901546001434326\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  390 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5228.7630770888645\n",
            "Mean Reward of that batch 80.44250887829023\n",
            "Daily average reward of all training: 3.7132153193843016\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: 0.005462825298309326\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  400 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5552.495760949274\n",
            "Mean Reward of that batch 85.42301170691191\n",
            "Daily average reward of all training: 3.8561415827350474\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: -0.49086159467697144\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  410 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3622.3689231038898\n",
            "Mean Reward of that batch 55.72875266313677\n",
            "Daily average reward of all training: 3.9568135547750103\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: -0.2013532519340515\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  420 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1059.3301490783506\n",
            "Mean Reward of that batch 16.2973869088977\n",
            "Daily average reward of all training: 3.985974310622798\n",
            "Max reward for a batch so far: 9799.821262850171\n",
            "Training Loss: -1.3003054857254028\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  430 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2444.4632610284943\n",
            "Mean Reward of that batch 37.60712709274607\n",
            "Daily average reward of all training: 4.047626227290567\n",
            "Max reward for a batch so far: 10239.971179874276\n",
            "Training Loss: -0.5744379162788391\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  440 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2553.8392590443273\n",
            "Mean Reward of that batch 39.28983475452811\n",
            "Daily average reward of all training: 4.093963408769858\n",
            "Max reward for a batch so far: 10239.971179874276\n",
            "Training Loss: 0.12430161237716675\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  450 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -21.013243233168396\n",
            "Mean Reward of that batch -0.3232806651256676\n",
            "Daily average reward of all training: 4.108819633705886\n",
            "Max reward for a batch so far: 10239.971179874276\n",
            "Training Loss: 0.47175994515419006\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  460 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6995.130089805959\n",
            "Mean Reward of that batch 107.61738599701475\n",
            "Daily average reward of all training: 4.191819637151643\n",
            "Max reward for a batch so far: 10239.971179874276\n",
            "Training Loss: -6.976221561431885\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  470 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 799.9002926554913\n",
            "Mean Reward of that batch 12.30615834854602\n",
            "Daily average reward of all training: 4.213659091866449\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -1.947181224822998\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  480 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1245.2808799644454\n",
            "Mean Reward of that batch 19.158167384068392\n",
            "Daily average reward of all training: 4.311795715967039\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -3.9813766479492188\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  490 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5158.33816259315\n",
            "Mean Reward of that batch 79.35904865527922\n",
            "Daily average reward of all training: 4.234291468108079\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -12.253657341003418\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  500 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3478.4269875181644\n",
            "Mean Reward of that batch 53.5142613464333\n",
            "Daily average reward of all training: 4.332593172333921\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -3.6920557022094727\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  510 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1711.1053237232563\n",
            "Mean Reward of that batch -26.324697288050096\n",
            "Daily average reward of all training: 4.375130330305615\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: 0.07661771774291992\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  520 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3341.7552441387634\n",
            "Mean Reward of that batch 51.41161914059636\n",
            "Daily average reward of all training: 4.42326033904944\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -16.754955291748047\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  530 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4180.592423075611\n",
            "Mean Reward of that batch 64.31680650885555\n",
            "Daily average reward of all training: 4.506256185491153\n",
            "Max reward for a batch so far: 10375.993630808705\n",
            "Training Loss: -24.7855281829834\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  540 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -901.5295822676662\n",
            "Mean Reward of that batch -13.869685881041018\n",
            "Daily average reward of all training: 4.619906167121561\n",
            "Max reward for a batch so far: 12101.076882101495\n",
            "Training Loss: -7.887182235717773\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  550 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6791.689224935888\n",
            "Mean Reward of that batch 104.4875265374752\n",
            "Daily average reward of all training: 4.640951013519612\n",
            "Max reward for a batch so far: 12101.076882101495\n",
            "Training Loss: -34.573455810546875\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  560 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1856.0373516872496\n",
            "Mean Reward of that batch 28.554420795188456\n",
            "Daily average reward of all training: 4.684779546783689\n",
            "Max reward for a batch so far: 12101.076882101495\n",
            "Training Loss: -26.132247924804688\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  570 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4852.807744919103\n",
            "Mean Reward of that batch 74.65858069106312\n",
            "Daily average reward of all training: 4.7420955408278855\n",
            "Max reward for a batch so far: 12101.076882101495\n",
            "Training Loss: -21.829345703125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  580 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -3082.9312727274846\n",
            "Mean Reward of that batch -47.42971188811515\n",
            "Daily average reward of all training: 4.724616377634268\n",
            "Max reward for a batch so far: 12101.076882101495\n",
            "Training Loss: -1.0544610023498535\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  590 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3526.3014189221612\n",
            "Mean Reward of that batch 54.250791060340944\n",
            "Daily average reward of all training: 4.8120693332211815\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -151.73643493652344\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  600 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1683.8364360957348\n",
            "Mean Reward of that batch 25.90517593993438\n",
            "Daily average reward of all training: 4.805176619195796\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: 25.328201293945312\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  610 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1145.6343490587087\n",
            "Mean Reward of that batch 17.625143831672442\n",
            "Daily average reward of all training: 4.853016051982904\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -95.51089477539062\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  620 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4306.56735202754\n",
            "Mean Reward of that batch 66.25488233888524\n",
            "Daily average reward of all training: 4.958287421329797\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -39.40446472167969\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  630 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6389.634693868448\n",
            "Mean Reward of that batch 98.30207221336074\n",
            "Daily average reward of all training: 4.97671341144993\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -376.37554931640625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  640 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1462.0727305878136\n",
            "Mean Reward of that batch -22.4934266244279\n",
            "Daily average reward of all training: 4.9939914979653475\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -15.115365982055664\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  650 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 4347.106664351053\n",
            "Mean Reward of that batch 66.87856406693928\n",
            "Daily average reward of all training: 5.013927638760885\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -185.59878540039062\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  660 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -2166.2136070004008\n",
            "Mean Reward of that batch -33.32636318462155\n",
            "Daily average reward of all training: 5.044190202918624\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -69.71248626708984\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  670 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1517.2256751514224\n",
            "Mean Reward of that batch 23.341933463868035\n",
            "Daily average reward of all training: 5.062620776040672\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -498.8285217285156\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  680 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2922.3972825546143\n",
            "Mean Reward of that batch 44.95995819314791\n",
            "Daily average reward of all training: 5.098296301292465\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -471.5347900390625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  690 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6972.293944285984\n",
            "Mean Reward of that batch 107.26606068132284\n",
            "Daily average reward of all training: 5.132148439048713\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -430.0428771972656\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  700 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -555.6952943172664\n",
            "Mean Reward of that batch -8.54915837411179\n",
            "Daily average reward of all training: 5.163759115373837\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -95.5791015625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  710 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3713.504412994901\n",
            "Mean Reward of that batch 57.13083712299848\n",
            "Daily average reward of all training: 5.166509973567911\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: 92.14250183105469\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  720 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1368.858757937116\n",
            "Mean Reward of that batch 21.059365506724863\n",
            "Daily average reward of all training: 5.157597472286317\n",
            "Max reward for a batch so far: 12299.20857232883\n",
            "Training Loss: -507.4488220214844\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  730 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1784.0578418486366\n",
            "Mean Reward of that batch 27.447043720748255\n",
            "Daily average reward of all training: 5.2150329067259085\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -529.2033081054688\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  740 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2461.1137056373664\n",
            "Mean Reward of that batch 37.863287779036405\n",
            "Daily average reward of all training: 5.239834667091871\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -1201.052490234375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  750 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 7782.962949138861\n",
            "Mean Reward of that batch 119.73789152521326\n",
            "Daily average reward of all training: 5.291179735710082\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -1048.0897216796875\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  760 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3879.595348193857\n",
            "Mean Reward of that batch 59.68608227990549\n",
            "Daily average reward of all training: 5.332132960998779\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -2583.474365234375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  770 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3987.250764840197\n",
            "Mean Reward of that batch 61.34231945907995\n",
            "Daily average reward of all training: 5.376811042719297\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -136.51095581054688\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  780 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2865.57975665508\n",
            "Mean Reward of that batch 44.08584241007816\n",
            "Daily average reward of all training: 5.393011516581758\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -286.1756896972656\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  790 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1246.4902100342388\n",
            "Mean Reward of that batch 19.176772462065212\n",
            "Daily average reward of all training: 5.424027594174318\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -856.650390625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  800 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 520.9104758304447\n",
            "Mean Reward of that batch 8.01400732046838\n",
            "Daily average reward of all training: 5.416396520716139\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -1059.8555908203125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  810 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2401.536157982824\n",
            "Mean Reward of that batch 36.946710122812675\n",
            "Daily average reward of all training: 5.446973709887034\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -3182.23193359375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  820 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 6801.916326380833\n",
            "Mean Reward of that batch 104.64486655970512\n",
            "Daily average reward of all training: 5.5389963613854025\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -2980.05126953125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  830 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -195.57594968244211\n",
            "Mean Reward of that batch -3.0088607643452634\n",
            "Daily average reward of all training: 5.55873475883353\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: 1197.2462158203125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  840 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -2224.4290530615226\n",
            "Mean Reward of that batch -34.22198543171573\n",
            "Daily average reward of all training: 5.5959944942220385\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -949.2965698242188\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  850 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3957.87096473343\n",
            "Mean Reward of that batch 60.89032253436046\n",
            "Daily average reward of all training: 5.604376876092286\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -945.4159545898438\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  860 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -872.0881776802125\n",
            "Mean Reward of that batch -13.416741195080192\n",
            "Daily average reward of all training: 5.630282620706282\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: 257.8325500488281\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  870 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 3789.293314328296\n",
            "Mean Reward of that batch 58.29682022043533\n",
            "Daily average reward of all training: 5.666167370546823\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -5507.849609375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  880 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -73.67139606395813\n",
            "Mean Reward of that batch -1.1334060932916634\n",
            "Daily average reward of all training: 5.644569346451498\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -1988.4366455078125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  890 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1404.4817471297229\n",
            "Mean Reward of that batch 21.607411494303427\n",
            "Daily average reward of all training: 5.684551359507975\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -3521.248779296875\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  900 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -2567.071132326768\n",
            "Mean Reward of that batch -39.49340203579643\n",
            "Daily average reward of all training: 5.669747809104972\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -2902.53564453125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  910 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2159.173505642205\n",
            "Mean Reward of that batch 33.218053932957\n",
            "Daily average reward of all training: 5.650891065845544\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -3261.5224609375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  920 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5193.378473873184\n",
            "Mean Reward of that batch 79.89813036727975\n",
            "Daily average reward of all training: 5.689294914823974\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -2984.726806640625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  930 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 873.3603326163447\n",
            "Mean Reward of that batch 13.436312809482226\n",
            "Daily average reward of all training: 5.688887504612208\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -1513.3541259765625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  940 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: -1022.9567593151487\n",
            "Mean Reward of that batch -15.737796297156134\n",
            "Daily average reward of all training: 5.6681505251316455\n",
            "Max reward for a batch so far: 12977.210259544103\n",
            "Training Loss: -7658.291015625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  950 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2498.2815470265223\n",
            "Mean Reward of that batch 38.43510072348496\n",
            "Daily average reward of all training: 5.6891291616401665\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -3951.65869140625\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  960 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1985.9961653151986\n",
            "Mean Reward of that batch 30.553787158695364\n",
            "Daily average reward of all training: 5.678404526831139\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -6406.37939453125\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  970 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 7544.560377916385\n",
            "Mean Reward of that batch 116.07015966025207\n",
            "Daily average reward of all training: 5.666602873720253\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -11652.435546875\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  980 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 1684.3528155583635\n",
            "Mean Reward of that batch 25.91312023935944\n",
            "Daily average reward of all training: 5.664132281941791\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -3230.72607421875\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  990 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 2903.5439741581613\n",
            "Mean Reward of that batch 44.669907294740945\n",
            "Daily average reward of all training: 5.672139674485876\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -324.4661865234375\n",
            "==========================================\n",
            "==========================================\n",
            "Epoch:  1000 / 1000\n",
            "-----------\n",
            "Number of training episodes: 65\n",
            "Total reward: 5268.151235259331\n",
            "Mean Reward of that batch 81.04848054245124\n",
            "Daily average reward of all training: 5.700582420760013\n",
            "Max reward for a batch so far: 15119.133178952161\n",
            "Training Loss: -14186.556640625\n",
            "==========================================\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "CGEXDQeIdnHu",
        "colab_type": "code",
        "outputId": "ebf0ea5a-fede-4b91-cd4e-808342887143",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 905
        }
      },
      "cell_type": "code",
      "source": [
        "comparison_bl_ac = actual_reward_axis - baseline_axis\n",
        "network_labels = ['CNN', 'DFF NN']\n",
        "\n",
        "for i, compare in enumerate(comparison_array):\n",
        "    plt.figure(0)\n",
        "    plt.plot(ep_index, daily_avg_reward_axis[i],'.',label=str(compare))\n",
        "    plt.figure(1)\n",
        "    plt.plot(ep_index, actual_reward_axis[i],'.', label=str(compare))\n",
        "    plt.figure(2)\n",
        "    plt.plot(ep_index, loss_axis[i],'-', label=str(compare))\n",
        "    \n",
        "plt.figure(0)\n",
        "plt.legend()\n",
        "plt.ylabel('Daily avg reward')\n",
        "plt.xlabel('Epoch')\n",
        "plt.savefig('avg.png', dpi=300)\n",
        "\n",
        "plt.figure(1)\n",
        "plt.legend()\n",
        "plt.ylabel('Actual profit ($)')\n",
        "plt.xlabel('Epoch')\n",
        "plt.savefig('actual.png', dpi=300)\n",
        "\n",
        "plt.figure(2)\n",
        "plt.legend()\n",
        "plt.yscale('symlog')\n",
        "plt.ylabel('Loss')\n",
        "plt.xlabel('Epoch')\n",
        "plt.savefig('loss.png', dpi=300)\n",
        "\n",
        "print('bL mean 1/2',np.mean(baseline_axis[i][0:150]),' bL mean 2/2',np.mean(baseline_axis[i][150:]),)\n",
        "print('bL std 1/2', np.std(baseline_axis[i][0:150]),'bL std 2/2',np.std(baseline_axis[i][150:]),)\n",
        "print()\n",
        "\n",
        "for i, compare in enumerate(comparison_array):\n",
        "    print('mean 1/2',np.mean(actual_reward_axis[i][0:150]),'mean 2/2',np.mean(actual_reward_axis[i][150:]),)\n",
        "    print('std 1/2', np.std(actual_reward_axis[i][0:150]),'std 2/2',np.std(actual_reward_axis[i][150:]),)\n",
        "    print()\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "bL mean 1/2 3151.9032610305608  bL mean 2/2 3441.5129966482864\n",
            "bL std 1/2 3335.53812617748 bL std 2/2 3264.2520400265366\n",
            "\n",
            "mean 1/2 783.8489195644223 mean 2/2 2913.161957071933\n",
            "std 1/2 2425.002443008707 std 2/2 3142.133264323618\n",
            "\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff1969baf28>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nJTGuAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff1acb9b438>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nQRCEgPx/PkZvMoRJJ8AAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff196a36978>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "mv7_Tja3wavR",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "##Testing"
      ]
    },
    {
      "metadata": {
        "id": "I_SK8OWkwcfP",
        "colab_type": "code",
        "outputId": "edeb8da4-984e-4b2d-d7c0-5551a0f169ca",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 714
        }
      },
      "cell_type": "code",
      "source": [
        "test_eps = 100\n",
        "training = False\n",
        "with tf.Session() as sess:\n",
        "    test_rewards, test_actual_rewards, test_BL_rewards, test_actions = [],[],[],[]\n",
        "    ep_test_rewards, ep_test_actual_rewards, ep_test_BL_rewards, ep_test_actions = [],[],[],[]\n",
        "    all_test_rewards, all_test_actual_rewards, all_test_BL_rewards, all_test_actions = [],[],[],[]\n",
        "    total_test_rewards = []\n",
        "    train_max_steps = test_rows - 1 - stack_size\n",
        "    step_index = [i for i in range(train_max_steps)]\n",
        "    \n",
        "    \n",
        "    \n",
        "    for j, comparison in enumerate(comparison_array):\n",
        "        # Load the model\n",
        "        saver.restore(sess,\"./models/model\" + str(j) + \".ckpt\")\n",
        "        \n",
        "        for episode in range(test_eps):\n",
        "            total_rewards = 0;\n",
        "            step = 0\n",
        "            prev_action_id = -1\n",
        "            test_env = Environment(market_dataset = test_data_norm,\n",
        "                                   stock_prices = train_price_data, \n",
        "                                    total_params = global_total_params,\n",
        "                                    number_of_stocks = number_of_stocks,\n",
        "                                    current_index = 0,\n",
        "                                    agent_state = init_agent_state[:],\n",
        "                                    action_size = global_action_size,\n",
        "                                    brokerage_fee = brokerage_fee,\n",
        "                                    stack_size = stack_size)\n",
        "\n",
        "            test_env.reset(0, init_agent_state[:],2)\n",
        "    \n",
        "            state = test_env.get_state()   \n",
        "            step = 0\n",
        "            while step < train_max_steps:\n",
        "                step += 1\n",
        "                \n",
        "                agent_state = test_env.get_agent_state() \n",
        "                action_id = choose_action(state, agent_state, test_env, training, PGNetwork2)\n",
        "                action = test_env.actions[action_id]\n",
        "\n",
        "                # Perform action and get next state\n",
        "                next_state, disc_reward, act_reward  = test_env.next(action_id)\n",
        "\n",
        "                if (step == 1):\n",
        "                    test_rewards.append(disc_reward)\n",
        "                    test_actual_rewards.append(act_reward)\n",
        "                    test_BL_rewards.append(test_env.get_reward_baseline())   \n",
        "                    test_actions.append(action_id)   \n",
        "                else:\n",
        "                    test_rewards.append(test_rewards[step - 2] + disc_reward)\n",
        "                    test_actual_rewards.append(test_actual_rewards[step - 2] + act_reward)\n",
        "                    test_BL_rewards.append(test_BL_rewards[step - 2] + test_env.get_reward_baseline())\n",
        "                    test_actions.append(action_id) \n",
        "\n",
        "                total_rewards += disc_reward\n",
        "                state = next_state\n",
        "            \n",
        "            if episode % 10 == 0:\n",
        "                print(\"stock: \", 0)\n",
        "                print(\"Reward: \", total_rewards)\n",
        "                \n",
        "                action_probability_distribution = sess.run(PGNetwork2.action_distribution, \n",
        "                                                   feed_dict={PGNetwork2.inputs_: state.reshape((1, *state_size)),\n",
        "                                                             PGNetwork2.agent_inputs : agent_state.reshape((1,2))})\n",
        "                print(action_id, action_probability_distribution)\n",
        "                print(\"==========================================\")\n",
        "            \n",
        "            ep_test_rewards.append(test_rewards)\n",
        "            ep_test_actual_rewards.append(test_actual_rewards)\n",
        "            ep_test_BL_rewards.append(test_BL_rewards)\n",
        "            ep_test_actions.append(test_actions)\n",
        "            \n",
        "            test_rewards, test_actual_rewards, test_BL_rewards, test_actions = [],[],[],[]\n",
        "            total_rewards = 0\n",
        "            \n",
        "        all_test_rewards.append(ep_test_rewards)\n",
        "        all_test_actual_rewards.append(ep_test_actual_rewards)\n",
        "        all_test_BL_rewards.append(ep_test_BL_rewards)\n",
        "        all_test_actions.append(ep_test_actions)\n",
        "        \n",
        "        ep_test_rewards, ep_test_actual_rewards, ep_test_BL_rewards, ep_test_actions = [],[],[],[]"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "INFO:tensorflow:Restoring parameters from ./models/model0.ckpt\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n",
            "stock:  0\n",
            "Reward:  [3815.34499773]\n",
            "0 [[0. 1. 0.]]\n",
            "==========================================\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "J_YA8z1oh9qj",
        "colab_type": "code",
        "outputId": "53c14293-6e67-41ee-9dd0-a4a420b5f320",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 803
        }
      },
      "cell_type": "code",
      "source": [
        "# Plot test results\n",
        "for i in range(len(comparison_array)):\n",
        "    for j in range(test_eps - 1):\n",
        "        plt.figure(3*i)\n",
        "        plt.plot(step_index,all_test_rewards[i][j],'-')\n",
        "        plt.figure(3*i + 1)\n",
        "        plt.plot(step_index, all_test_actual_rewards[i][j], 'b-')\n",
        "        \n",
        "    j += 1    \n",
        "    plt.figure(3*i + 1)\n",
        "    plt.plot(step_index, all_test_BL_rewards[i][j], 'g-',label='ground truth')\n",
        "    plt.plot(step_index, all_test_actual_rewards[i][j], 'b-', label='model')\n",
        "    plt.figure(3*i)\n",
        "    plt.ylabel('Daily avg reward')\n",
        "    plt.xlabel('Day')\n",
        "    plt.savefig('test_discrete_'+str(i)+'.png', dpi=300)\n",
        "    \n",
        "    plt.figure(3*i + 1)\n",
        "    plt.legend()\n",
        "    plt.ylabel('Actual profit ($)')\n",
        "    plt.xlabel('Day')\n",
        "    plt.savefig('test_actual_'+str(i)+'.png', dpi=300)\n",
        "\n",
        "    plt.figure(3*i + 2)\n",
        "    plt.plot(step_index,all_test_actions[i][0],'b.')\n",
        "    plt.ylabel('Actions')\n",
        "    plt.xlabel('Day')\n",
        "    plt.savefig('test_actions_'+str(i)+'.png', dpi=300)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff19a680940>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n7S82gkrbBAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff19b3c1588>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ff19a7ddc50>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    }
  ]
}